package com.cwnu.sw.cys.core.websocket.domain.enums;

import com.cwnu.sw.cys.core.websocket.domain.vo.resp.*;
import com.cwnu.sw.cys.core.websocket.domain.vo.resp.*;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * WebSocket响应类型枚举
 * 用于定义WebSocket通信中可能的响应类型，以及每种类型对应的描述和数据结构
 */
@AllArgsConstructor
@Getter
public enum WSRespTypeEnum {
    // 登录二维码返回
    LOGIN_URL(1, "登录二维码返回", WSLoginUrl.class),
    // 用户扫描成功等待授权
    LOGIN_SCAN_SUCCESS(2, "用户扫描成功等待授权", null),
    // 用户登录成功返回用户信息
    LOGIN_SUCCESS(3, "用户登录成功返回用户信息", WSLoginSuccess.class),
    // 新消息
    MESSAGE(4, "新消息", WSMessage.class),
    // 上下线通知
    ONLINE_OFFLINE_NOTIFY(5, "上下线通知", WSOnlineOfflineNotify.class),
    // 使前端的token失效，意味着前端需要重新登录
    INVALIDATE_TOKEN(6, "使前端的token失效，意味着前端需要重新登录", null),
    // 拉黑用户
    BLACK(7, "拉黑用户", WSBlack.class),
    // 消息标记
    MARK(8, "消息标记", WSMsgMark.class),
    // 消息撤回
    RECALL(9, "消息撤回", WSMsgRecall.class),
    // 好友申请
    APPLY(10, "好友申请", WSFriendApply.class),
    // 成员变动
    MEMBER_CHANGE(11, "成员变动", WSMemberChange.class),
    ;

    // 类型代码
    private final Integer type;
    // 类型描述
    private final String desc;
    // 类型对应的数据结构
    private final Class dataClass;

    // 缓存，用于快速根据类型代码查找枚举实例
    private static Map<Integer, WSRespTypeEnum> cache;

    // 静态初始化块，初始化缓存
    static {
        cache = Arrays.stream(WSRespTypeEnum.values()).collect(Collectors.toMap(WSRespTypeEnum::getType, Function.identity()));
    }

    /**
     * 根据类型代码获取对应的枚举实例
     *
     * @param type 类型代码
     * @return 对应的枚举实例
     */
    public static WSRespTypeEnum of(Integer type) {
        return cache.get(type);
    }
}
